// ----------------【ESP32遥控车接收端】-----------------------------------------------------------------------

#include "Motor.h"
#include <async_time.h>
#include <Freenove_WS2812_Lib_for_ESP32.h>

#define LEDS_COUNT 12  // ws2812引脚数量
#define CHANNEL 0      // ws2812 Channel

// 定义枚举
enum LedType {
  LEFT,
  RIGHT,
  LEFT_ATMOSPHERE,
  RIGHT_ATMOSPHERE
};

u8 m_color[16][3] = {
  { 254, 0, 0 },
  { 255, 85, 0 },
  { 255, 170, 1 },
  { 255, 255, 1 },
  { 170, 255, 2 },
  { 30, 253, 29 },
  { 0, 255, 1 },
  { 0, 255, 85 },
  { 0, 255, 171 },
  { 0, 170, 255 },
  { 0, 85, 254 },
  { 0, 0, 254 },
  { 87, 0, 255 },
  { 255, 0, 254 },
  { 255, 0, 170 },
  { 255, 0, 86 },
};

Freenove_ESP32_WS2812 strip = Freenove_ESP32_WS2812(LEDS_COUNT, WS2812_PIN, CHANNEL);

bool swL1 = false;
bool swL2 = false;
bool swR1 = false;
bool swR2 = false;

AsyncTime left_veer_time = AsyncTime(0, 3, 300);     // 左转向灯定时器
AsyncTime right_veer_time = AsyncTime(0, 3, 300);    // 右转向灯定时器
AsyncTime left_ambient_time = AsyncTime(1, 91, 80);  // 左氛围灯定时器
AsyncTime right_ambient_time = AsyncTime(1, 91, 80); // 右氛围灯定时器
int left_ambient_index = 0;
int right_ambient_index = 4;

MotorControl motor;

void setup() {
  Serial.println("波特率 115200");
  Serial.begin(115200);
  motor.init();

  Serial.println("WS2812初始化");
  pinMode(WS2812_PIN, OUTPUT);
  offLeds(0, LEDS_COUNT);
  strip.begin();
  strip.setBrightness(10);

  // Serial.print("连接wifi: " + WIFI_SSID);
  // WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // 连接wifi
  // // 判断是否连接成功
  // while (WiFi.status() != WL_CONNECTED)
  // {
  //   delay(500);
  //   Serial.print(".");
  // }
  // Serial.print("连接wifi: " + WIFI_SSID + " 成功");

  // 初始化 IOXESP32 音频
  // Audio.begin();
  // // 设置音量
  // Audio.setVolume(70);

  // Audio.play("https://coolism-web.cdn.byteark.com/;stream/1");
}

void loop() {
  motor.read();
  motor.loadServo();
  motor.loadMotor();
  setLeds();
  delay(50);
}

void setLeds() {
  // 左转向灯设置
  if (motor.tank_kvs.sw_L1 == LOW || motor.left_sw) {
    if (!swL1) {
      swL1 = true;
      left_veer_time.clear();
    }
  } else {
    swL1 = false;
    left_veer_time.clear();
    off_left_veer();
  }

  // 右转向灯设置
  if (motor.tank_kvs.sw_R2 == LOW || motor.right_sw) {
    if (!swR2) {
      swR2 = true;
      right_veer_time.clear();
    }
  } else {
    swR2 = false;
    right_veer_time.clear();
    off_right_veer();
  }

  // 左氛围灯设置
  if (motor.tank_kvs.sw_L2 == LOW) {
    if (!swL2) {
      swL2 = true;
      left_ambient_time.clear();
    }
  } else {
    swL2 = false;
    left_ambient_index = 0;
    left_ambient_time.clear();
    offLeds(0, 4);
  }

  // 右氛围灯设置
  if (motor.tank_kvs.sw_R1 == LOW) {
    if (!swR1) {
      swR1 = true;
      right_ambient_time.clear();
    }
  } else {
    swR1 = false;
    right_ambient_index = 0;
    right_ambient_time.clear();
    offLeds(4, 8);
  }

  // 设置灯亮度
  strip.setBrightness(map(motor.tank_kvs.L_knob, -100, 100, 10, 255));

  left_veer_time.start(left_veer_led, swL1);
  right_veer_time.start(right_veer_led, swR2);
  left_ambient_time.start(left_ambient_led, swL2);
  right_ambient_time.start(right_ambient_led, swR1);
}

// 左转向灯
void left_veer_led(int index) {
  if (index < 2) {
    // Serial.println("左转向灯");
    set_led(9, 255, 214, 0);
    set_led(10, 255, 214, 0);
  } else {
    off_left_veer();
  }
  left_veer_time.clearPreviousTime();
}

// 关闭左转向灯
void off_left_veer() {
  set_led(9, 0, 0, 0);
  set_led(10, 0, 0, 0);
}

// 右转向灯
void right_veer_led(int index) {
  if (index < 2) {
    // Serial.println("右转向灯");
    set_led(8, 255, 214, 0);
    set_led(11, 255, 214, 0);
  } else {
    off_right_veer();
  }
  right_veer_time.clearPreviousTime();
}

// 关闭右转向灯
void off_right_veer() {
  set_led(8, 0, 0, 0);
  set_led(11, 0, 0, 0);
}

// 左氛围灯
void left_ambient_led(int index) {
  if (index % 5 > 0) {
    u8 *color = m_color[left_ambient_index];
    set_led((index % 5) - 1, color[0], color[1], color[2]);
  } else {
    left_ambient_index++;
    if (left_ambient_index == 16) {
      left_ambient_index = 0;
    }
  }
  left_ambient_time.clearPreviousTime();
}

// 右氛围灯
void right_ambient_led(int index) {
  if (index % 5 > 0) {
    u8 *color = m_color[right_ambient_index];
    set_led(index % 5 + 3, color[0], color[1], color[2]);
  } else {
    right_ambient_index++;
    if (right_ambient_index == 16) {
      right_ambient_index = 0;
    }
  }
  right_ambient_time.clearPreviousTime();
}

// 关灯 ws2812
void offLeds(int min, int max) {
  for (int i = min; i < max; i++) {
    set_led(i, 0, 0, 0);
  }
}

// 设置灯
// index 下标
// r g b三原色
void set_led(int index, int r, int g, int b) {
  strip.setLedColorData(index, r, g, b);
  strip.show();
  delay(1);
}